#ifndef __03_HEADER__
#define __03_HEADER__
//第三期项目的头文件
#include "my_header.h"

//extern char * PATH;
extern int fd;  //文件描述符
extern char *mp; //mmap返回值
extern size_t mmap_size; //文件映射的长度
extern int cursize; //此次已经成功传输的文件长度
extern off_t offset; //偏移量
extern off_t filesize; //真实的将要接收的文件的大小
extern int current_statu; //标记状态，0表示未传输文件，1表示正在传输文件
extern int sig;  //ctr + c的信号
extern pid_t pid; //客户端进程id

typedef enum command_s{
    CD = 1,
    LS,
    PUTS,
    GETS,
    REMOVE,
    PWD,
    MKDIR,
    RMDIR,
    AUTH = 100,
    SIGN_IN = 101,
    DEL = 102
}command_t;

typedef struct train_s{
    int type;//代表本次传输的命令的种类，长度4B
    int lenth;//代表小火车正文的长度，长度4B
    char value[1024];//代表要传输的命令正文
}train_t;

//文件传输专用TLV
typedef struct{
    int length;
    command_t tag;
    char data[256];
}TLV;
//注册登录验证功能
int signAndAuthPasswd(int sockfd, char* username, char* passwd, char *mode);
void readInput(char *buffer, int size, const char *prompt);
//计算哈希值功能
void hash_compute(char *sha1str,char *pathname);
//解析命令功能
int sendRequest(int sockfd, char *request, int type);
int recvRequest(int sockfd, train_t *train);

//传输文件功能
int recvn(int sockfd, void *buf, int n);
void client_gets_file(int sockfd, TLV *tlv);
void client_puts_file(int sockfd, TLV *tlv, char *pathname);
int recvfile(int sockfd, char *pathname);
int transfile(int sockfd, char *pathname);
#endif
